package edu.ccut.saturn.component.impl.directory;

import java.util.Enumeration;

import org.osgi.framework.Bundle;

import edu.ccut.saturn.component.ComponentFactory;
import edu.ccut.saturn.component.IBundleInfo;
import edu.ccut.saturn.component.IBundleValidateInfo;
import edu.ccut.saturn.component.SaturnComponentException;

/**
 * 验证组件文件夹路径资源的实现类，验证组件文件夹位于bundle的根路径或模块类型文件夹内部，用于保存验证组件的配置文件。
 * 通过加载方法加载验证组件文件夹内部的验证组件。验证组件的配置文件的文件后缀是“.validate”。
 * <p>
 * <code>SaturnValidateDirectoryInfo</code>扩展了类<code>AbstractDirectoryInfo</code>。
 * 
 * @author 温建
 * 
 * @version 1.0 2008.8.29
 * 
 * @see AbstractDirectoryInfo
 * @see IBundleInfo
 * @see ComponentFactory
 * @see IBundleValidateInfo
 * 
 */
public class SaturnValidateDirectoryInfo extends AbstractDirectoryInfo {

	private static final String SATURN_VALIDATE_FILE_POSTFIX = ".validate";

	public SaturnValidateDirectoryInfo() {
		super(SATURN_DIRECTORY_TYPE_VALIDATE);
	}

	/**
	 * 验证组件文件夹加载内部的验证组件配置文件的方法。 首先获得文件夹内部的所有的验证组件的访问路径；然后调用<code>ComponentFactory</code>获得验证组件的加载实例，
	 * 并保存到bundle对应的<code>IBundleInfo</code>实例中的<code>IBundleValidateInfo</code>中。
	 * 
	 * @param bundle
	 *            加载的bundle对象实例
	 * @param bundleInfo
	 *            保存bundle的加载信息
	 */
	@SuppressWarnings("unchecked")
	public void load(Bundle bundle, IBundleInfo bundleInfo) {

		Enumeration<String> dataFiles = bundle.getEntryPaths(super
				.getDirectoryPath());

		while (dataFiles.hasMoreElements()) {
			String dataFile = dataFiles.nextElement();

			try {

				if (dataFile != null
						&& dataFile.endsWith(SATURN_VALIDATE_FILE_POSTFIX)) {

					bundleInfo.getBundleValidateInfo().addValidateInfo(
							ComponentFactory.getValidateInfo(bundle, dataFile));
				}

			} catch (SaturnComponentException e) {
				logger.error("load validate failed! the file name is \""
						+ dataFile + "\" in bundle ["
						+ bundle.getSymbolicName() + "]");
			}
		}
	}
}
